package service;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import java.util.Arrays;
import java.util.List;
import org.jaaksi.commondemo.R;
import org.jaaksi.commondemo.model.Person;

/**
 * 创建时间：2017年12月05日15:44 <br>
 * 作者：fuchaoyang <br>
 * 描述：
 * App A和App C绑定App B的MyService的流程，如下：
 * 第一次App A绑定Service时，创建了IntentBindRecord实例，并记录在AppBindRecord中。
 * 执行onBind()后，App B进程通过publishService()将binder传给了AMS，记录在IntentBindRecord实例中，并设置标志位received。
 *
 * 第二次App C绑定Service时，获取之前的IntentBindRecord实例，判断标志位received为true，则直接调用App
 * C的onServiceConnected()将binder对象传给App C。
 * 所以第二次没有调用onBind()。
 */

public class TestServiceActivity extends Activity {

  private ServiceConnection mConnection;

  @Override protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_service);
  }

  public void onStart(View view) {
    // 1.直接通过class发送广播，收到的action=null
    Intent intent = new Intent(this, MyService.class);
    //intent.setClassName(getPackageName(),MyService.class.getName());

    // 2.通过action + PackageName
    //Intent intent = new Intent("android.intent.action.qiqi");
    //intent.setPackage(getPackageName());

    intent.putExtra("id", 123);
    intent.putExtra("info", new Person("001"));
    startService(intent);
  }

  public void onBind(View view) {
    Intent intent = new Intent(this, MyService.class);
    intent.putExtra("id", 123);
    intent.putExtra("info", new Person("001"));
    mConnection = new ServiceConnection() {
      @Override public void onServiceConnected(ComponentName name, IBinder service) {
        Log.e(MyService.TAG, "onServiceConnected...");
        IMsgManager manager = IMsgManager.Stub.asInterface(service);

        try {
          manager.setCallback(new ICallBack.Stub() {
            @Override public void callback(MsgInfo info) throws RemoteException {
              // todo 这里就获取到了异步的数据
              System.out.println("msgInfo = " + info.toString());
            }
          });
          manager.getMsgInfo();
        } catch (RemoteException e) {
          e.printStackTrace();
        }
      }

      @Override public void onServiceDisconnected(ComponentName name) {
        Log.e(MyService.TAG, "onServiceDisconnected...");
      }
    };
    // fixme 多次调用bindService只会执行一次 onBind
    // 跨进程时只需要把 aidl文件和对应的bean文件考到对应工程，启动service建立连接 xxx.Stub.asInterface(IBinder);
    bindService(intent, mConnection, BIND_AUTO_CREATE);
  }

  @Override protected void onDestroy() {
    Intent intent = new Intent(this, MyService.class);
    stopService(intent);

    if (mConnection != null) {
      unbindService(mConnection);
    }
    super.onDestroy();
  }
}
